package com.jichangxiu.server.platform.action;

import cn.hutool.core.collection.ListUtil;
import com.jichangxiu.common.annotation.*;
import com.jichangxiu.common.entity.bo.PageData;
import com.jichangxiu.common.utils.TokenUtils;
import com.jichangxiu.framework.action.BaseAction;
import com.jichangxiu.server.platform.entity.dto.PlatformConfigQueryDto;
import com.jichangxiu.server.platform.entity.vo.PlatformConfigAddVo;
import com.jichangxiu.server.platform.entity.vo.PlatformConfigEditVo;
import com.jichangxiu.server.platform.entity.vo.PlatformConfigQueryVo;
import com.jichangxiu.server.platform.service.PlatformConfigService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springdoc.api.annotations.ParameterObject;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;

import javax.annotation.Resource;
import javax.validation.constraints.NotBlank;
import java.util.List;

/**
 * PlatformConfigAction:
 * 平台-配置管理控制器
 *
 * @author Jcx
 * @create 2023-02-25 22:10
 */
@Slf4j
@Rest("/platform/config")
@Tag(name = "平台-配置管理控制器")
public class PlatformConfigAction extends BaseAction {

    @Resource
    private TokenUtils tokenUtils;

    @Resource
    private PlatformConfigService platformConfigService;

    /**
     * 新增配置
     *
     * @param platformConfigAddVo 配置视图对象
     * @return 是否成功
     */
    @Post("/add")
    @Operation(summary = "平台-新增配置")
    @PreAuthorize("@ss.hasPermission('platform:config:add')")
    public String add(@RequestBody PlatformConfigAddVo platformConfigAddVo) {
        return toStr(platformConfigService.add(platformConfigAddVo));
    }

    /**
     * 多选级联删除配置
     *
     * @param configIds 配置ID列表
     * @return 是否成功
     */
    @Delete("/del")
    @Operation(summary = "平台-多选级联删除配置")
    @PreAuthorize("@ss.hasPermission('platform:config:del')")
    public String del(@RequestBody String[] configIds) {
        return toStr(platformConfigService.del(ListUtil.toList(configIds)));
    }

    /**
     * 修改配置信息
     *
     * @param platformConfigEditVo 配置视图对象
     * @return 是否成功
     */
    @Put("/edit")
    @Operation(summary = "平台-修改配置信息")
    @PreAuthorize("@ss.hasPermission('platform:config:edit')")
    public String edit(@RequestBody PlatformConfigEditVo platformConfigEditVo) {
        return toStr(platformConfigService.edit(platformConfigEditVo));
    }

    /**
     * 根据ID获取配置详情
     *
     * @param configId 配置ID
     * @return 配置详情
     */
    @Get("/info/{configId}")
    @Operation(summary = "平台-根据ID获取配置详情")
    @PreAuthorize("@ss.hasPermission('platform:config:info')")
    public PlatformConfigQueryDto info(@PathVariable("configId") @NotBlank(message = "配置ID不能为空") String configId) {
        return platformConfigService.info(configId);
    }

    /**
     * 分页查询配置列表
     *
     * @param platformConfigQueryVo 配置视图对象
     * @return 分页配置列表
     */
    @Get("/pageList")
    @Operation(summary = "平台-分页查询配置列表")
    @PreAuthorize("@ss.hasPermission('platform:config:pageList')")
    public PageData<PlatformConfigQueryDto> pageList(@ParameterObject PlatformConfigQueryVo platformConfigQueryVo) {
        return platformConfigService.pageList(platformConfigQueryVo);
    }

    /**
     * 获取平台初始化配置
     *
     * @return 配置列表
     */
    @Get("/getInitPlatformConfig")
    @Operation(summary = "平台-获取平台初始化配置")
    public List<PlatformConfigQueryDto> getInitPlatformConfig() {
        return platformConfigService.getInitPlatformConfig();
    }

    /**
     * 获取系统初始化配置
     *
     * @return 配置列表
     */
    @Get("/getInitSystemConfig")
    @Operation(summary = "平台-获取系统初始化配置")
    @PreAuthorize("@ss.hasPermission('platform:config:getInitSystemConfig')")
    public List<PlatformConfigQueryDto> getInitSystemConfig() {
        return platformConfigService.getInitSystemConfig();
    }

    /**
     * 根据配置标识和配置键名跨租户获取配置键值
     *
     * @param configCode 配置标识
     * @param configKey  配置键名
     * @return 配置键值
     */
    @Get("/getPlatformConfigValue/{configCode}/{configKey}")
    @Operation(summary = "平台-根据配置标识和配置键名获取配置键值")
    @PreAuthorize("@ss.hasPermission('platform:config:getConfigValue')")
    public String getPlatformConfigValue(@PathVariable("configCode") String configCode, @PathVariable("configKey") String configKey) {
        return platformConfigService.getPlatformConfigValue(configCode, configKey);
    }

    /**
     * 根据配置标识和配置键名跨租户获取配置键值
     *
     * @param configCode   配置标识
     * @param configKey    配置键名
     * @param defaultValue 为空时的默认值
     * @return 配置键值
     */
    @Get("/getPlatformConfigValueWithDefault/{configCode}/{configKey}/{defaultValue}")
    @Operation(summary = "平台-根据配置标识和配置键名获取配置键值")
    @PreAuthorize("@ss.hasPermission('platform:config:getConfigValueWithDefault')")
    public String getPlatformConfigValueWithDefault(@PathVariable("configCode") String configCode, @PathVariable("configKey") String configKey, @PathVariable("defaultValue") String defaultValue) {
        return platformConfigService.getPlatformConfigValue(configCode, configKey, defaultValue);
    }

    /**
     * 根据配置标识和配置键名获取当前租户的配置键值
     *
     * @param configCode 配置标识
     * @param configKey  配置键名
     * @return 配置键值
     */
    @Get("/getConfigValue/{configCode}/{configKey}")
    @Operation(summary = "平台-根据配置标识和配置键名获取配置键值")
    @PreAuthorize("@ss.hasPermission('platform:config:getConfigValue')")
    public String getConfigValue(@PathVariable("configCode") String configCode, @PathVariable("configKey") String configKey) {
        return platformConfigService.getConfigValue(tokenUtils.getTenantId(), configCode, configKey);
    }

    /**
     * 根据配置标识和配置键名获取当前租户的配置键值
     *
     * @param configCode   配置标识
     * @param configKey    配置键名
     * @param defaultValue 为空时的默认值
     * @return 配置键值
     */
    @Get("/getConfigValueWithDefault/{configCode}/{configKey}/{defaultValue}")
    @Operation(summary = "平台-根据配置标识和配置键名获取配置键值")
    @PreAuthorize("@ss.hasPermission('platform:config:getConfigValueWithDefault')")
    public String getConfigValueWithDefault(@PathVariable("configCode") String configCode, @PathVariable("configKey") String configKey, @PathVariable("defaultValue") String defaultValue) {
        return platformConfigService.getConfigValue(tokenUtils.getTenantId(), configCode, configKey, defaultValue);
    }

}
